
/**
 * @file TEST_sem_scheduler.c
 * @author Linquan  
 * @brief 
 * @version 1.0
 * @date 2024-07-15
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#include "app_config.h"
#if TEST_SEM_SCHEDULER


#include "sys_tick.h"


/* 声明两个主任务类 */

/* 生产者任务类 */
TS_TASK_VAR_START(TASK_type_product)
   
TS_TASK_VAR_END

/* 消费者任务类 */
TS_TASK_VAR_START(TASK_type_consume)

TS_TASK_VAR_END


/* 创建主任务实例 */
TS_TASK_VAR(TASK_type_product)  product_var;
TS_TASK_VAR(TASK_type_consume)  consume_var;


void consume_timeout_callback()
{
    B_RED_PRINT("consume timeout \n");
}

/**
 * @brief 消费者任务
 *     
 * 
 */

TS_TaskFunStart(TASK_type_consume)
 
    B_PURPLE_PRINT("consume start\n");
    while(1) 
    {     
        printf("request product \n");
        TS_SEM_WAIT_TIMEOUT(product_var, __MS(2000), consume_timeout_callback);
        printf("get product one\n");
        TS_WaitX(__MS(500));
       
    }
TS_TaskFunEnd

/**
 * @brief 生产者任务
 *      
 */
TS_TaskFunStart(TASK_type_product)

    TS_WaitX(__MS(2000));
    printf("product start \n");

    while(1) 
    {     
        printf("producting... \n");

        TS_SEM_SIGNAL(product_var);
        TS_WaitX(__MS(1000));
    }
TS_TaskFunEnd



/**
 * @brief 时间戳回调函数
 * 
 */
static void Master_TS_tick_callbak()
{   
        TS_UpdateTimer(product_var);
        TS_UpdateTimer(consume_var);// 10ms tick
}

/**
 * @brief 调度框架时基初始化
 * 
 * @param ptr 
 */
void  Master_TS_Init(void *ptr)
{ 
    /* 赋值 定时器回调函数 */ 
    sys_timer_callback_add(&Master_TS_tick_callbak); 

    /* 初始化 信号量 */
    TS_SEM_INIT(product_var,0);
}
EXPORT_Lv2_PREV(Master_TS_Init, NULL);



/**
 * @brief 任务运行
 * 
 * @param task_list_ptr 
 */
void runtasks(void *task_list_ptr)
{
    /* 先运行消费者 */
    TS_RunTask(TASK_type_consume,consume_var);

    /* 再运行生产者 */
    TS_RunTask(TASK_type_product,product_var);
}
EXPORT_Lv7_APP_MANGE(runtasks, NULL);



#endif

